home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Anwendungen / glmatrix / source / glmatrix_main.c < prev    next >
Encoding:
C/C++ Source or Header  |  2004-01-31  |  6.4 KB  |  266 lines

  1. #include <exec/types.h>
  2. #include <exec/libraries.h>
  3. #include <dos/dos.h>
  4. #include <libraries/commodities.h>
  5. #include <workbench/startup.h>
  6. #include <proto/exec.h>
  7. #include <proto/commodities.h>
  8. #include <clib/alib_protos.h>
  9. #include <clib/alib_stdio_protos.h>
  10.  
  11. #include "glmatrix_gui.h"
  12. #include "glmatrix_prefs.h"
  13.  
  14. extern void screenblanker_init(void);
  15. extern void screenblanker_destroy(void);
  16. extern void screenblanker_blank(void);
  17. extern void screenblanker_unblank(void);
  18. extern void screenblanker_display(void);
  19.  
  20. struct Library *CxBase = NULL;
  21. struct IntuitionBase *IntuitionBase = NULL;
  22. struct Library *ResourceBase = NULL;
  23.  
  24. CxObj *broker = NULL;
  25. CxObj *screensaver_object = NULL;
  26. struct MsgPort *broker_mp = NULL;
  27. ULONG cxsigflag = 0;
  28.  
  29. LONG csignal = 0L;
  30. ULONG csigflag = 0L;
  31. struct Task *maintask = NULL;
  32.  
  33. static ULONG timeout = 0;
  34. static BOOL do_blank = FALSE;
  35. static BOOL blanked = FALSE;
  36.  
  37. struct NewBroker newbroker = {
  38.     NB_VERSION,
  39.     "GLMatrix",
  40.     "GLMatrix",
  41.     "MiniGL Matrix Screen Saver",
  42.     NBU_UNIQUE | NBU_NOTIFY,
  43.     COF_SHOW_HIDE,
  44.     0,
  45.     0,
  46.     0
  47. };
  48.  
  49. void handle_signal(void)
  50. {
  51.     if (do_blank)
  52.     {
  53.         screenblanker_blank();
  54.         do_blank = FALSE;
  55.     }
  56.     else
  57.     {
  58.         screenblanker_unblank();
  59.     }
  60. }
  61.  
  62. void ProcessMessage(void)
  63. {
  64.     ULONG signal = 0L;
  65.     BOOL running = TRUE;
  66.     CxMsg *msg = NULL;
  67.  
  68.     while (running)
  69.     {
  70.         if (blanked)
  71.         {
  72.             screenblanker_display();
  73.  
  74.             /* Check and clear signals */
  75.             signal = SetSignal(0L, cxsigflag | csigflag | SIGBREAKF_CTRL_C);
  76.         }
  77.         else
  78.         {
  79.             signal = Wait(cxsigflag | csigflag | SIGBREAKF_CTRL_C | gui_window_signals);
  80.         }
  81.  
  82.         if (signal & gui_window_signals)
  83.         {
  84.             gui_handle_window();
  85.         }
  86.  
  87.         if (signal & cxsigflag)
  88.         {
  89.             while (msg = (CxMsg *)GetMsg(broker_mp))
  90.             {
  91.                 ULONG msgtype = CxMsgType(msg);
  92.                 ULONG msgid = CxMsgID(msg);
  93.  
  94.                 switch (msgtype)
  95.                 {
  96.                     case CXM_IEVENT:
  97.                         break;
  98.                     case CXM_COMMAND:
  99.                         switch (msgid)
  100.                         {
  101.                             case CXCMD_DISABLE:
  102.                                 ActivateCxObj(broker, FALSE);
  103.                                 break;
  104.                             case CXCMD_ENABLE:
  105.                                 ActivateCxObj(broker, TRUE);
  106.                                 break;
  107.  
  108.                             case CXCMD_APPEAR:
  109.                                 gui_open();
  110.                                 break;
  111.                             case CXCMD_DISAPPEAR:
  112.                                 gui_close();
  113.                                 break;
  114.  
  115.                             case CXCMD_UNIQUE:
  116.                                 gui_open();
  117.                                 break;
  118.  
  119.                             case CXCMD_KILL:
  120.                                 /*printf("CXCMD_KILL\n");*/
  121.                                 running = FALSE;
  122.                                 break;
  123.                             default:
  124.                                 /*printf("Unknown msgid\n");*/
  125.                                 break;
  126.                         }
  127.                         break;
  128.                     default:
  129.                         /*printf("Unknown msgtype\n");*/
  130.                         break;
  131.                 }
  132.  
  133.                 ReplyMsg((struct Message *)msg);
  134.             } /* while messages */
  135.         }  /*if message signal */
  136.  
  137.         if (signal & SIGBREAKF_CTRL_C)
  138.         {
  139.             /*printf("CTRL-C signal break \n");*/
  140.             running = FALSE;
  141.         }
  142.         else if (signal & csigflag)
  143.         {
  144.             handle_signal();
  145.         }
  146.     }
  147. }
  148.  
  149. void screensaver(CxMsg *cxm, CxObj *co)
  150. {
  151.     struct InputEvent *ie = CxMsgData(cxm);
  152.  
  153.     if (ie->ie_Class == IECLASS_TIMER)
  154.     {
  155.         if (!blanked)
  156.         {
  157.             if (++timeout >= (glmatrix_prefs->glm_Timeout * 10L))
  158.             {
  159.                 /* blank */
  160.                 blanked = TRUE;
  161.                 do_blank = TRUE;
  162.                 Signal(maintask, csigflag);
  163.             }
  164.         }
  165.     }
  166.     else if (ie->ie_Class != IECLASS_TIMER)
  167.     {
  168.         /* unblank */
  169.         timeout = 0L;
  170.         if (blanked)
  171.         {
  172.             do_blank = FALSE;
  173.             Signal(maintask, csigflag);
  174.             blanked = FALSE;
  175.         }
  176.     }
  177. }
  178.  
  179. BOOL open_libs(void)
  180. {
  181.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37L);
  182.     if (IntuitionBase == NULL) return FALSE;
  183.  
  184.     CxBase = OpenLibrary("commodities.library", 37L);
  185.     if (CxBase == NULL) return FALSE;
  186.  
  187.     ResourceBase = OpenLibrary("resource.library", 37L);
  188.     if (ResourceBase == NULL) return FALSE;
  189.  
  190.     return TRUE;
  191. }
  192.  
  193. void close_libs(void)
  194. {
  195.     if (ResourceBase != NULL) CloseLibrary(ResourceBase);
  196.     ResourceBase = NULL;
  197.  
  198.     if (CxBase != NULL) CloseLibrary(CxBase);
  199.     CxBase = NULL;
  200.  
  201.     if (IntuitionBase != NULL) CloseLibrary((struct Library *)IntuitionBase);
  202.     IntuitionBase = NULL;
  203. }
  204.  
  205.  
  206. int main(void)
  207. {
  208.     CxMsg *msg = NULL;
  209.  
  210.     if (open_libs())
  211.     {
  212.         if (gui_init())
  213.         {
  214.             maintask = FindTask(NULL);
  215.             csignal = AllocSignal(-1L);
  216.             csigflag = 1L << csignal;
  217.  
  218.             broker_mp = CreateMsgPort();
  219.             if (broker_mp != NULL)
  220.             {
  221.                 newbroker.nb_Port = broker_mp;
  222.                 broker = CxBroker(&newbroker, NULL);
  223.                 if (broker != NULL)
  224.                 {
  225.                     cxsigflag = 1L << broker_mp->mp_SigBit;
  226.  
  227.                     screensaver_object = CxCustom(screensaver, 0L);
  228.                     if(screensaver_object != NULL)
  229.                     {
  230.                         AttachCxObj(broker, screensaver_object);
  231.  
  232.                         if (!CxObjError(screensaver_object))
  233.                         {
  234.                             ActivateCxObj(broker, 1L);
  235.  
  236.                             screenblanker_init();
  237.  
  238.                             ProcessMessage();
  239.  
  240.                             screenblanker_destroy();
  241.                         }
  242.                     }
  243.  
  244.                     DeleteCxObjAll(broker);
  245.                     while (msg = (CxMsg *)GetMsg(broker_mp))
  246.                     {
  247.                         ReplyMsg((struct Message *)msg);
  248.                     }
  249.                 }
  250.  
  251.                 DeletePort(broker_mp);
  252.             }
  253.             FreeSignal(csignal);
  254.         }
  255.     }
  256.  
  257.     gui_destroy();
  258.     close_libs();
  259.     return 0;
  260. }
  261.  
  262. void wbmain(struct WBStartup *args)
  263. {
  264.     main();
  265. }
  266.